package com.tidy.seed.util;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 树形结构工具类（包含内部接口ITreeNode）
 */
public class TreeUtils {

    /**
     * 内部接口：定义树形节点的规范
     */
    public interface ITreeNode<T> {
        Integer getId();

        Integer getParentId();

        void setChildren(List<T> children);
    }

    /**
     * 将扁平列表转换为树形结构
     *
     * @param allNodes     所有节点的扁平列表
     * @param rootParentId 根节点的父ID（通常为-1或null）
     * @param <T>          实现ITreeNode接口的节点类型
     * @return 树形结构列表
     */
    public static <T extends ITreeNode<T>> List<T> buildTree(List<T> allNodes, Integer rootParentId) {
        List<T> rootNodes = allNodes.stream()
                .filter(node -> {
                    Integer parentId = node.getParentId();
                    if (rootParentId == null) {
                        return parentId == null;
                    }
                    return rootParentId.equals(parentId);
                })
                .collect(Collectors.toList());

        for (T node : rootNodes) {
            setChildren(allNodes, node);
        }

        return rootNodes;
    }

    private static <T extends ITreeNode<T>> void setChildren(List<T> allNodes, T parentNode) {
        List<T> children = allNodes.stream()
                .filter(node -> parentNode.getId().equals(node.getParentId()))
                .collect(Collectors.toList());

        parentNode.setChildren(children);
        children.forEach(child -> setChildren(allNodes, child));
    }
}
